package cn.jw.starter.web.common;

import java.io.Serializable;
import java.util.Objects;

import com.fasterxml.jackson.annotation.JsonIgnore;

import lombok.Data;

/**
 * 通用返回对象
 *
 * @param <T>
 *            数据泛型
 */
@Data
public class JwCommonResult<T> implements Serializable {
    private static final int SUCCESS_CODE = 200;
    /**
     * 响应码，200 表示正常，其它表示错误
     *
     */
    private Integer code;
    /**
     * 返回数据
     */
    private T data;
    /**
     * 错误提示，用户可阅读
     *
     */
    private String msg;
    /**
     * 请求的uri地址，当前端需要根据错误码处理不同的业务时，为了区分不同模块有可能错误码重复的问题，
     * 在返回时返回请求的uri，这样前端就可以针对此请求返回的错误码进行相关的业务处理。
     */
    private String requestUri;

    /**
     * 创建错误返回对象
     * 
     * @param code
     * @param message
     * @return
     */
    public static JwCommonResult error(Integer code, String message) {
        JwCommonResult result = new JwCommonResult<>();
        result.code = code;
        result.msg = message;
        return result;
    }

    public static JwCommonResult error(JwErrorBase errorCode) {
        return error(errorCode.getErrorCode(), errorCode.getErrorMsg());
    }

    public static JwCommonResult error(JwErrorBase errorCode, String msg) {
        return error(errorCode.getErrorCode(), msg);
    }

    public static <T> JwCommonResult<T> success(T data) {
        JwCommonResult<T> result = new JwCommonResult<>();
        result.code = SUCCESS_CODE;
        result.data = data;
        result.msg = "成功";
        return result;
    }

    public static boolean isSuccess(Integer code) {
        return Objects.equals(code, SUCCESS_CODE);
    }

    @JsonIgnore // 避免 jackson 序列化
    public boolean isSuccess() {
        return isSuccess(code);
    }

    @JsonIgnore // 避免 jackson 序列化
    public boolean isError() {
        return !isSuccess();
    }
}
